package lesson04.作业.作业01;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.LockSupport;

/**
 * 第一种：synchronized   wait notify 必须两年成对，第一个先等待再唤醒，第二个先唤醒然后再等待（notify并不能获得线程锁，只有执行了wait才能获得锁）
 * 第二种：CountDownLatch  使用两个门闩控制
 * 第三种：LockSupport    1、t1线程检测到size==5时，应该时先唤醒t2线程，然后直接陷入阻塞，等待被t2唤醒
 *                      2、 加入t1唤醒t2时自己不进入阻塞等待，这时size很可能被更改，因为两个线程再同时运行了
 */
public class LockSupportDemo {

    volatile List lists = new LinkedList();
    public void add(Object a){
        lists.add(a);
    }

    public Integer size(){
        return lists.size();
    }
    static Thread t1 = null,t2 =null;
    public static void main(String[] args) {
        LockSupportDemo demo = new LockSupportDemo();

        t2 = new Thread(()->{
            System.out.println("t2 start");
            //if(demo.size()!=5) {
                LockSupport.park();
            //}
            System.out.println("size ---- " + demo.size());
            System.out.println("t2 end");
            LockSupport.unpark(t1);
        },"t2");

        t1 = new Thread(()->{
            System.out.println("t1 start");
            for (int i = 0; i < 10; i++) {
                demo.add(new Object());
                System.out.println(i);
                if( demo.size() == 5) {

                    LockSupport.unpark(t2);
                    LockSupport.park();
                }

            }
        },"t1");

        t2.start();
        t1.start();
    }
}
